/**
 * 动作栈表
 * @param {*} option
 */
function sActions(option){
    option = option ? option : {};
    
    /**
     * 最大动作步数
     */
    var maxSize = ((value)=>{
        var val = parseFloat(value);
        if(val.toString() == "NaN") {
            return false;
        }
        return val > -1;
    })(option.maxSize) ? option.maxSize : 1000;

    var list = [];
    var index = 0;

    /**
     * 推入一个新增动作并返回
     * @params {*} 区域类型
     * @returns 
     */
    this.pushAddAction = function(type){
        return pushAction(new sAddAction(type));
    }

    /**
     * 推入一个删除动作并返回
     * @params {*} 区域类型
     * @returns
     */
    this.pushDeleteAction = function(type){
        return pushAction(new sDeleteAction(type));
    }

    /**
     * 推入一个修改动作并返回
     * @params {*} 区域类型
     * @returns
     */
    this.pushModifyAction = function(type){
        return pushAction(new sModifyAction(type));
    }

    /**
     * 推入一个修改动作并返回
     * @params {*} 区域类型
     * @returns
     */
    this.pushReplaceAction = function(type){
        return pushAction(new sReplaceAction(type));
    }

    /**
     * 推入动作
     * @param {*} action 
     * @returns 
     */
    var pushAction = function(action){
        sActionShare.call(action);

        action.setLeaveTrace(option.leaveTrace);

        list.splice(index, list.length - index, action);

        if(list.length > maxSize){
            list.splice(0, 1);
        }

        index = list.length;

        return action;
    }

    /**
     * 弹出最后一个动作
     */
    this.undo = function(){
        if(index == 0) return;

        index--;
        return list[index];
    }

    /**
     * 重新推入上一个弹出的动作
     */
    this.redo = function(){
        if(index >= list.length) return;

        var action = list[index];
        index++;

        return action;
    }
}
